/*
    项目消息类型字段信息定义
*/

#pragma once
#include <string>
#include <unordered_map>

namespace myrpc{
    // 消息请求字段信息定义
    inline std::string KEY_METHOD = "method";         // rpc请求方法名称
    inline std::string KEY_PARAMS = "parameters";     // rpc请求方法参数
    inline std::string KEY_TOPIC_KEY = "topic_key";   // 主题名称
    inline std::string KEY_TOPIC_MSG = "msg";         // 主题消息
    inline std::string KEY_OPTYPE = "optype";         // 操作类型
    inline std::string KEY_HOST = "host";             // 主机信息
    inline std::string KEY_HOST_IP = "ip";            // 主机IP地址
    inline std::string KEY_HOST_PORT = "port";        // 主机端口号
    inline std::string KEY_RCODE = "rcode";           // 请求响应码
    inline std::string KEY_RESULT = "result";         // 结果

    // 消息类型定义
    enum class MsgType{
        // RPC请求与响应
        REQ_RPC = 0,
        RSP_RPC,
        // 主题消息请求与响应
        REQ_TOPIC,
        RSP_TOPIC,
        // 服务操作请求与响应
        REQ_SERVICE,
        RSP_SERVICE
    };

    // RPC请求类型定义
    enum class RType{
        REQ_SYNC = 0,  // 同步
        REQ_ASYNC,     // 异步
        REQ_CALLBACK   // 函数回调
    };

    // 主题操作请求类型定义
    enum class TopicOpType{
        TOPIC_CREATE = 0, // 主题创建
        TOPIC_REMOVE,     // 主题删除
        TOPIC_SUBSCRIBE,  // 主题订阅
        TOPIC_CANCEL,     // 主题取消订阅
        TOPIC_PUBLISH     // 主题发布
    };

    // 服务操作请求类型定义
    enum class ServiceOpType{
        SERVICE_REGISTRY = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 服务上线
        SERVICE_OFFLINE,      // 服务下线
        SERVICE_UNKNOW        // 未知服务操作
    };

    // 响应码类型定义
    enum class RCode{
        RCODE_OK = 0,                // 成功处理
        RCODE_PARSE_FATLED,          // 消息解析失败
        RCODE_ERROR_MSGTYPE,         // 消息类型错误
        RCODE_INVALID_MSG,           // 无效消息
        RCODE_DISCONNECTED,          // 连接已断开
        RCODE_INVALID_PARAMS,        // 无效RPC参数
        RCODE_NOT_FOUND_SERVICE,     // 没有找到对应的服务
        RCODE_INVALID_OPTYPE,        // 无效的操作类型
        RCODE_NOT_FOUND_TOPIC,       // 没有找到对应的主题
        RCODE_INTERNAL_ERROR         // 内部错误
    };

    // 根据响应码获取对应的响应描述
    inline std::string errReason(RCode code){
        static const std::unordered_map<RCode, std::string> err_map = {
            {RCode::RCODE_OK, "Successfully handled! "},
            {RCode::RCODE_PARSE_FATLED, "Message parsing failed!"},
            {RCode::RCODE_ERROR_MSGTYPE, "Message type error!"},
            {RCode::RCODE_INVALID_MSG, "Invalid information!"},
            {RCode::RCODE_DISCONNECTED, "The connection has been disconnected!"},
            {RCode::RCODE_INVALID_PARAMS, "Invalid RPC parameters!"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "No corresponding service found!"},
            {RCode::RCODE_INVALID_OPTYPE, "Invalid operation type!"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "No corresponding topic found!"},
            {RCode::RCODE_INTERNAL_ERROR, "Internal error!"}
        };
        auto it = err_map.find(code);
        if (it == err_map.end()){
            return "Unknown error!";
        }
        return it->second;
    }
}